using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

namespace ScintillaXpm
{
	/// <summary>
	/// Converts Bitmap images to XPM data for use with ScintillaNet.
	/// Warning: images with more than (around) 50 colors will generate incorrect XPM
	/// The XpmConverter class was based on code from flashdevelop. 
	/// </summary>
	public static class XpmConverter
	{
		/// <summary>
		/// The default transparent Color
		/// </summary>
		public static string DefaultTransparentColor = "#FF00FF";

		/// <summary>
		/// cicles an image list object to convert contained images into xpm
		/// at the same time we add converted images into an arraylist that lets us to retrieve images later.
		/// Uses the DefaultTransparentColor.
		/// </summary>
		/// <param name="imageList">The image list to transform.</param>
		/// <returns></returns>
		static public List<string> ConvertToXPM(ImageList ImageList)
		{
			return ConvertToXPM(ImageList, DefaultTransparentColor);
		}

		/// <summary>
		/// cicles an image list object to convert contained images into xpm
		/// at the same time we add converted images into an arraylist that lets us to retrieve images later    
		/// </summary>
		/// <param name="imageList">The image list to transform.</param>
		/// <param name="transparentColor">The overriding transparent Color</param>
		/// <returns></returns>
		static public List<string> ConvertToXPM(ImageList imageList, string transparentColor)
		{
			List<string> xpmImages = new List<string>();
			foreach (Image image in imageList.Images)
			{
				if (image is Bitmap)
				{
					xpmImages.Add(ConvertToXPM(image as Bitmap, transparentColor));
				}
			}
			return xpmImages;
		}

		/// <summary>
		/// Converts Bitmap images to XPM data for use with ScintillaNet.
		/// Warning: images with more than (around) 50 colors will generate incorrect XPM.
		/// Uses the DefaultTransparentColor.
		/// </summary>
		/// <param name="bmp">The image to transform.</param>
		/// <returns></returns>
		static public string ConvertToXPM(Bitmap bmp)
		{
			return ConvertToXPM(bmp, DefaultTransparentColor);
		}

		/// <summary>
		/// Converts Bitmap images to XPM data for use with ScintillaNet.
		/// Warning: images with more than (around) 50 colors will generate incorrect XPM
		/// tColor: specified transparent color in format: "#00FF00".
		/// </summary>
		/// <param name="bmp">The image to transform.</param>
		/// <param name="transparentColor">The overriding transparent Color</param>
		/// <returns></returns>
		static public string ConvertToXPM(Bitmap bmp, string transparentColor)
		{
			StringBuilder sb = new StringBuilder();
			List<string> colors = new List<string>();
			List<char> chars = new List<char>();
			int width = bmp.Width;
			int height = bmp.Height;
			int index;
			sb.Append("/* XPM */static char * xmp_data[] = {\"").Append(width).Append(" ").Append(height).Append(" ? 1\"");
			int colorsIndex = sb.Length;
			string col;
			char c;
			for (int y = 0; y < height; y++)
			{
				sb.Append(",\"");
				for (int x = 0; x < width; x++)
				{
					col = ColorTranslator.ToHtml(bmp.GetPixel(x, y));
					index = colors.IndexOf(col);
					if (index < 0)
					{
						index = colors.Count + 65;
						colors.Add(col);
						if (index > 90) index += 6;
						c = Encoding.ASCII.GetChars(new byte[] { (byte)(index & 0xff) })[0];
						chars.Add(c);
						sb.Insert(colorsIndex, ",\"" + c + " c " + col + "\"");
						colorsIndex += 14;
					}
					else c = (char)chars[index];
					sb.Append(c);
				}
				sb.Append("\"");
			}
			sb.Append("};");
			string result = sb.ToString();
			int p = result.IndexOf("?");
			string finalColor = result.Substring(0, p) + colors.Count + result.Substring(p + 1).Replace(transparentColor.ToUpper(), "None");

			return finalColor;
		}
	}
}
